package com.spancer.contentcenter.configuration;

import org.springframework.context.ApplicationContextInitializer;
import org.springframework.context.ConfigurableApplicationContext;
import org.springframework.core.annotation.Order;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;

import java.util.HashMap;
import java.util.Map;

/**
 * author by: mars
 * Date: 2020/10/7 16:18
 * Description:
 * SpringBoot源码解析（ Chapter-3）
 * 1.系统初始化器实现方式(即：在容器refresh之前初始化自定义的一些内容)
 * > 初始化器：ApplicationContextInitializer
 * > Spring容器刷新之前执行的一个回调函数
 * > 向SpringBoot容器中注册属性
 * > 继承接口自定义实现
 *
 * 第一种初始化方式：
 * > 实现 ApplicationContextInitializer 接口，填充initialize()方法，设置自定义的配置
 * > 在 resources 目录下 创建META-INF ，创建spring.factories，将自定义的初始化类配置进去：
 *      org.springframework.context.ApplicationContextInitializer
 *      = com.spancer.contentcenter.configuration.FirstInitializer
 * > 通过 实现 ApplicationContextAware 接口，获取自定义初始化类中定义的配置属性
 */
@Order(1)
public class FirstInitializer implements ApplicationContextInitializer<ConfigurableApplicationContext> {

    @Override
    public void initialize(ConfigurableApplicationContext
                                       applicationContext) {
        // 获取系统环境
        ConfigurableEnvironment environment = applicationContext.getEnvironment();
        // 设置必要属性
        //environment.setRequiredProperties("mooc");
        Map<String,Object> map = new HashMap<>();
        map.put("key1","test1");
        MapPropertySource mapPropertySource = new MapPropertySource("firstInitial",map);
        environment.getPropertySources().addLast(mapPropertySource);
        System.out.println("run firstInitializer - mss ");
    }

}
